package com.yupi.springbootinit.service;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yupi.springbootinit.model.dto.salesorder.SalesOrderQueryRequest;
import com.yupi.springbootinit.model.entity.SalesOrder;
import com.yupi.springbootinit.model.entity.SalesOrderItem;
import com.yupi.springbootinit.model.vo.CountItemVO;
import com.yupi.springbootinit.model.vo.SalesOrderVO;

import java.util.List;

/**
 * 销售订单服务接口
 */
public interface SalesOrderService extends IService<SalesOrder> {

    /**
     * 校验订单信息（包含明细）
     *
     * @param salesOrder 订单主表
     * @param add        是否为新增操作
     * @param items      订单明细列表（必填）
     */
    void validSalesOrder(SalesOrder salesOrder, boolean add, List<SalesOrderItem> items);

    /**
     * 获取查询条件
     */
    QueryWrapper<SalesOrder> getQueryWrapper(SalesOrderQueryRequest salesOrderQueryRequest);

    /**
     * 获取订单VO（包含明细）
     */
    SalesOrderVO getSalesOrderVO(SalesOrder salesOrder);

    /**
     * 分页获取订单VO（批量查询明细，解决N+1问题）
     */
    Page<SalesOrderVO> getSalesOrderVOPage(Page<SalesOrder> salesOrderPage);

    /**
     * 根据订单号获取订单
     */
    SalesOrder getByOrderNumber(String orderNumber);

    /**
     * 根据ID获取订单（包含已删除记录）
     */
    SalesOrder getByIdIncludeDeleted(Long id);

    /**
     * 更新订单状态
     */
    boolean updateOrderStatus(Long orderId, String newStatus, String currentNode, Double progress);

    /**
     * 获取订单状态统计
     */
    List<CountItemVO> getStatusStatistics(String orderType);

    /**
     * 获取紧急程度统计
     */
    List<CountItemVO> getUrgencyStatistics(String orderType);

    /**
     * 获取即将到期的订单
     */
    List<SalesOrderVO> getUpcomingDeliveryOrders(Integer days, String orderType);

    /**
     * 获取逾期订单
     */
    List<SalesOrderVO> getOverdueOrders(String orderType);

    /**
     * 创建销售订单（自动生成订单号）
     *
     * @param salesOrder 订单主表
     * @param items      订单明细列表（必填）
     * @return 订单ID
     */
    Long createSalesOrder(SalesOrder salesOrder, List<SalesOrderItem> items);

    /**
     * 创建研发订单（自动生成订单号）
     *
     * @param salesOrder 订单主表
     * @param items      订单明细列表（必填）
     * @return 订单ID
     */
    Long createRdoOrder(SalesOrder salesOrder, List<SalesOrderItem> items);

    /**
     * 更新订单（包含明细和附件）
     *
     * @param orderId             订单ID
     * @param salesOrder          订单主表
     * @param items               订单明细列表
     * @param deleteAttachmentIds 需要删除的附件ID列表
     * @return 是否成功
     */
    boolean updateOrderWithItems(Long orderId, SalesOrder salesOrder,
                                 List<SalesOrderItem> items,
                                 List<Long> deleteAttachmentIds);

    /**
     * 获取订单的第一个产品名称
     */
    String getFirstProductName(Long orderId);

    /**
     * 获取订单的第一个产品料号
     */
    String getFirstProductCode(Long orderId);

    /**
     * 获取订单的总数量
     */
    Integer getTotalQuantity(Long orderId);
}